Librairies et jeu de données

library(rmarkdown)
library(tidyverse) # pour  %>%
library(kableExtra) # kbl
library(knitr) # kable
library(ggplot2)
library(plotly) # graphes dynamiques
library(MASS)
library(corrplot) # corrplot
library(GGally) # ggpairs
library(gridExtra) # co-plot pour ggplot

Télécharger le jeu de données EPO modifié et nommer le mydata.

mydata=read.csv2("mydata2.csv",sep=',',row.names = 1)
paged_table(mydata)

Transformer la nature des variables nécessaires.

mydata$sexe<-as.factor(mydata$sexe)  
mydata$taille<-as.numeric(mydata$taille)   
mydata$Score<-as.factor(mydata$Score) 
mydata$niveau<-ordered(mydata$niveau,levels=c("L1_2","L3","M1_2"))
 str(mydata)
## 'data.frame':    38 obs. of  6 variables:
##  $ sexe             : Factor w/ 2 levels "F","H": 1 1 1 1 1 1 1 1 1 1 ...
##  $ age              : int  22 20 25 34 20 19 18 21 21 21 ...
##  $ taille           : num  1.7 1.66 1.65 1.62 1.66 1.64 1.61 1.63 1.63 1.65 ...
##  $ niveau           : Ord.factor w/ 3 levels "L1_2"<"L3"<"M1_2": 2 2 3 3 2 1 2 2 2 2 ...
##  $ scoreConnaissance: int  3 3 1 3 2 1 1 2 3 3 ...
##  $ Score            : Factor w/ 3 levels "=3","inf à 3",..: 1 1 2 1 2 2 2 2 1 1 ...

Pour alléger les écritures, procédons à des copies de nos variables

sexe<-mydata$sexe
age<-mydata$age
taille<-mydata$taille
niveau<-mydata$niveau
Score<-mydata$Score
scoreNum<-mydata$scoreConnaissance

1. Vocabulaires et premières définitions

Soit une population \(\mathcal P\) de taille \(n\), on s’intéresse maintenant à deux caractères, le caractère \(X\) et le caractère \(Y\).

Série statistique bivariée \((x_1,y_1),\cdots,(x_n,y_n)\): A chaque individu \(i\) de la population, on observe \((x_i,y_i)\).

Modalités Valeurs distinctes prises par la série. Notons

  • Pour \(j=1,\cdots,J\), on note \(m^X_{j}\) les modalités de \(X\) et \(n_{j\cdot}\) l’effectif de \(m^X_{j}\).

  • Pour \(k=1,\cdots,K\), on note \(m^Y_{k}\) les modalités de \(Y\) et \(n_{\cdot k}\) l’effectif de \(m^Y_{k}\).

  • Pour \(k=1,\cdots,K\) et \(j=1,\cdots,J\) on note \(n_{j k}\), l’ effectif croisé des modalités \((m^X_{j},m^Y_{k})\).


📌 Si l’une des deux variables (ou les deux) est quantitative continue, remplacer respectivement par des classes!

Tableau de contingence:

Tableau à double entrées : effectifs croisés \(n_{jk}\)


library(kableExtra)
table(sexe,niveau) %>% kbl()# %>%kable_styling()
L1_2 L3 M1_2
F 5 16 2
H 1 12 2


Tableau des fréquences/Distribution empirique jointe:

Tableau à double entrées : fréquences croisés \(f_{jk}\in(0,1)\)


prop.table(table(sexe,niveau))%>% kbl()
L1_2 L3 M1_2
F 0.1315789 0.4210526 0.0526316
H 0.0263158 0.3157895 0.0526316


Tableaux des fréquences marginales /distributions marginales:

Tableaux des fréquences marginales \(f_{j\cdot}\in(0,1)\) et \(f_{\cdot k}\in(0,1)\)


prop.table(table(sexe))%>% kbl()
sexe Freq
F 0.6052632
H 0.3947368
prop.table(table(niveau))%>% kbl()
niveau Freq
L1_2 0.1578947
L3 0.7368421
M1_2 0.1052632


Tableaux des fréquences conditionnelles :

Profils colonnes (\(Y/X\)) :Tableau des distibutions empiriques conditionnelles de \(\left(Y=m^Y_k/m^X_j\right)_{k=1,\cdots,K}\): chaque colone \(k\) correspond à la distribution conditionnelle de \(Y=m^Y_k/m^X_j\) \[f_{k | j} = \frac{f_{jk}}{f_{j\cdot}}.\]

Profils lignes (\(X/Y\)) Tableau des distibutions empiriques conditionnelles de \(\left(X=m^X_j/Y=m^Y_k\right)_{j=1,\cdots,J}\): chaque ligne \(j\) correspond à la distribution conditionnelle de \(X=m^X_j/Y=m^Y_k\) \[f_{j | k} = \frac{f_{jk}}{f_{\cdot k}}.\]


#Profils colonnes
kable(prop.table(table(sexe,niveau), margin = 2))
L1_2 L3 M1_2
F 0.8333333 0.5714286 0.5
H 0.1666667 0.4285714 0.5
#Profils lignes 
kable(prop.table(table(sexe,niveau), margin = 1))
L1_2 L3 M1_2
F 0.2173913 0.6956522 0.0869565
H 0.0666667 0.8000000 0.1333333

Task 1

Task 1.A.

Afficher le tableau de la distribution empirique jointe des variables (sexe,Score).

Solution

 kable(prop.table(table(sexe,Score)))
=3 inf à 3 sup à 3
F 0.2631579 0.2631579 0.0789474
H 0.1315789 0.1052632 0.1578947

Task 1.B.

Afficher le tableau des distributions empiriques marginales des variables sexe et Score.

Solution

prop.table(table(sexe))%>% kbl()
sexe Freq
F 0.6052632
H 0.3947368
prop.table(table(Score))%>% kbl()
Score Freq
=3 0.3947368
inf à 3 0.3684211
sup à 3 0.2368421

Task 1.C.

Afficher le tableau des profils colonnes et des profils lignes pour les variables sexe et Score.

Solution

prop.table(table(sexe,Score), margin = 2)%>% kbl()
=3 inf à 3 sup à 3
F 0.6666667 0.7142857 0.3333333
H 0.3333333 0.2857143 0.6666667
prop.table(table(sexe,Score), margin = 1)%>% kbl()
=3 inf à 3 sup à 3
F 0.4347826 0.4347826 0.1304348
H 0.3333333 0.2666667 0.4000000

💡 Bon à savoir !

La commande tapply permet de calculer un indicateurs (moyennes, des écarts types,…) d’une variable quantitative \(X\) en fonction des modalités d’un ou deux facteurs. tapply(X,facteur,indicateur)


# En fonction d'1 facteur
tapply(age,niveau,mean)%>% kbl()
x
L1_2 19.66667
L3 21.17857
M1_2 26.00000
# En fonction de 2 facteurs
tapply(age,list(sexe=sexe,niveau=niveau),mean)%>% kbl()
L1_2 L3 M1_2
F 19.8 20.68750 29.5
H 19.0 21.83333 22.5

Task 2

Task 2.

Afficher la moyenne de la variable quantitative taille en fonction des modalités des facteurs Score et niveau.

Solution

tapply(taille,list(Score=Score,Niveau=niveau),mean)%>% kbl()
L1_2 L3 M1_2
=3 1.676667 1.681818 1.62
inf à 3 1.640000 1.663636 1.65
sup à 3 1.850000 1.671667 1.71

2. Tests : Existe-t-il un lien entre deux variables ?

Tests:

\(H_0\): Pas de lien vs \(H_1\) :Lien

  • Tests paramétriques (TP) : puissants mais pas toujours possibles (sous conditions).

  • Tests non-paramétriques (TNP) : moins puissants mais les conditions d’application sont moins strictes.


📌 Bon à savoir !

\(p\)-value petite \(\Rightarrow\) rejet de \(H_0\) donc Lien

\(p\)-value grande \(\Rightarrow\) non rejet de \(H_0\) donc Pas de lien


fisher.test(sexe,niveau)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  sexe and niveau
## p-value = 0.5443
## alternative hypothesis: two.sided

👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.

Qualitative \(F1\) & qualitative \(F2\)

Test exact de Fisher (TNP). \(\ H_0\): Indépendance vs \(H_1\) : dépendance.

Command R : fisher.test(F1,F2)


fisher.test(sexe,niveau)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  sexe and niveau
## p-value = 0.5443
## alternative hypothesis: two.sided

👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.

Qualitative \(F\) (2 modalités) & numérique \(X\)

Test de Wilcoxon (TNP). \(\ H_0\): \(median_1=median_2\) vs \(H_1\) : \(\overline{H_0}\).

Command R : wilcox.test(X ~ F)


wilcox.test(taille~sexe)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  taille by sexe
## W = 6, p-value = 6.51e-07
## alternative hypothesis: true location shift is not equal to 0

👀 Petite \(p\)-value, rejet d’\(H_0\), il existe un lien.

Qualitative \(F\) (3 modalités) & numérique \(X\)

Test de Kruskal-Wallis (TNP). \(\ H_0\): \(median_i\) égales vs \(H_1\) : \(\overline{H_0}\).

Command R : kruskal.test(X ~ F)


kruskal.test(age~niveau)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  age by niveau
## Kruskal-Wallis chi-squared = 12.191, df = 2, p-value = 0.002252

👀 Petite \(p\)-value, rejet d’\(H_0\), il existe un lien.

Numérique \(X\) & numérique \(Y\)

Test de Spearman (corrélation). \(\ H_0\): \(corr_{X,Y}=0\) vs \(H_1\) : \(\overline{H_0}\).

Command R : cor.test(X,Y,method="spearman")


cor.test(age,taille,method="spearman")
## 
##  Spearman's rank correlation rho
## 
## data:  age and taille
## S = 7844.8, p-value = 0.3964
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.1416105

👀 Grande \(p\)-value, non rejet d’\(H_0\), il n’existe pas de lien.

Task 3

Task 3.A.

Existe-t-il un lien entre les variables qualitatives Score et niveau? Faire un test.

Solution

fisher.test(Score,niveau)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  Score and niveau
## p-value = 0.8311
## alternative hypothesis: two.sided

👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.

Task 3.B.

Existe-t-il un lien entre la variable quantitative age et la variable qualitative sexe? Faire un test.

Solution

wilcox.test(age~sexe)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  age by sexe
## W = 106.5, p-value = 0.04496
## alternative hypothesis: true location shift is not equal to 0

👀 Petite \(p\)-value, rejet d’\(H_0\) donc lien.

Task 3.C.

Existe-t-il un lien entre la variable quantitative age et la variable qualitative Score? Faire un test.

Solution

kruskal.test(age~Score)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  age by Score
## Kruskal-Wallis chi-squared = 1.1904, df = 2, p-value = 0.5515

👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.

Task 3.D.

Existe-t-il un lien entre la variable quantitative age et la variable qualitative scoreNum? Faire un test.

Solution

cor.test(age,scoreNum,method="spearman")
## 
##  Spearman's rank correlation rho
## 
## data:  age and scoreNum
## S = 7952.9, p-value = 0.4374
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.1297848

👀 Grande \(p\)-value, non rejet d’\(H_0\) donc pas de lien.

3. Représentations graphiques

Qualitative \(F1\) & Qualitative \(F2\)

Qualitative \(F1\) & Qualitative \(F2\): Comparaison par diagrammes en barres de 2 facteurs.


plot_ly( x =sexe, color = niveau) %>%
  add_histogram()
plot_ly( x =niveau, color = sexe) %>%
  add_histogram()

Task 4

Task 4.

Comparer les variables qualitatives niveau et Score à l’aide d’un diagramme en barres.

Solution

plot_ly( x =Score, color = niveau) %>%
  add_histogram()

Qualitative \(F\) & Numérique \(X\)

Qualitative \(F\) & Numérique \(X\):

  • Comparaison par histogramme: Histogramme de \(X\) suivant les modalités de \(F\).

  • Comparaison par boxplots: Boxplots de \(X\) suivant les modalités de \(F\).

  • Diagramme en barres: Comparaison d’un indicateur (moyenne, écart type,…) de \(X\) suivant les modalités de \(F\)


plot_ly(x = age, color = sexe,type = 'histogram', nbinsx = 5) %>%
  layout(xaxis = list(title = 'Taille'),yaxis = list(title = 'Effectif'))
plot_ly(y = age, color = sexe,type = 'box') %>%
  layout(yaxis = list(title = 'Taille'))
plot_ly(y = tapply(taille,sexe,sd),x=levels(sexe), type = 'bar',marker = list(color =c( "cyan","blue"))) %>%
  layout(xaxis = list(title = 'Taille'),yaxis = list(title = 'Ecart type'))

Task 5

Task 5.A.

Afficher les boxplots de la variable age suivant les modalités de la variable Score.

Solution

plot_ly(y = age, color = Score,type = 'box') %>%
  layout(yaxis = list(title = 'Taille'))

Task 5.B.

Comparer l’age moyen des participants suivant leur niveau via une représentation graphique.

Solution

plot_ly(y = tapply(age,niveau,mean),x=levels(niveau), type = 'bar',marker = list(color =c( "cyan","blue","purple"))) %>%
  layout(xaxis = list(title = 'Taille'),yaxis = list(title = 'Ecart type'))

Numérique \(X\) & Numérique \(Y\)

Numérique \(X\) & Numérique \(Y\):

  • La fonction corrplotde la librairie corrplotpermet une visualisation 2 à 2 des corrélations : Uniquement pour les variables numériques.

    • Interprétation par forme : “rond” = aucune corrélation \(\longrightarrow\)trait”= corrélation linéaire.
    • Interprétation par couleur : “clair” = aucune corrélation \(\longrightarrow\)fonçé”= corrélation linéaire.
    • De plus si l’ellipse est penche vers la guauche cela correspond à une corrélation négative et vers la droite correspond à une corrélation positive.
  • Pour aller plus loin La fonction ggpairsde la librairie GGally affiche une visualisation 2 à 2 des des variables. Il est possible de choisir une variables catégorielles pour faire ces représentations en fonction des modalités de cette dernière.


library(corrplot)
Data_numerique<-mydata[,c(2,3,5)]
correlation_matrix<-cor(Data_numerique)
corrplot(correlation_matrix, method="ellipse", type = "upper",addCoef.col = "black")

library(GGally)
ggpairs(mydata)

ggpairs(mydata[,-c(1)], aes(color=mydata$sexe))

Numérique \(X\) & Numérique \(Y\):

  • Une reprensentation visuelle de \(Y\) par rapport à \(X\) est le nuage de points.

  • Auquel on peut ajouter la courbe \(f\) la plus proche de tous les points \[ y=\left\{\begin{array}{ll} f(x)=ax+b & \text{la droite des moindres carrés}\\ f(x)& \text{estimé de façon non paramétrique}\\ \end{array} \right. \]


Fonction ggplot() de R

  • ggplot(mydata) : crée une fenêtre et appelle le jeu de donnée

  • ggplot(mydata)+ aes(x = age, y =taille,color=sexe) : crée deux axes: un axe des abscisses nommé age et un axe des ordonnées nommé taille

  • Ajouter+ geom_point(): affiche des points de coordonnées \(x_i=`age_i`\) et \(y_i=`taille_i`\)

  • Ajouter + geom_smooth() ajoute le tracé de la fonction la plus “proche” de tous les points

  • Ajouter + geom_smooth(method = "lm") ajoute le tracé de la droite affine la plus “proche” de tous les points, c’est la droite des moindres carrées.

  • l’option se = FALSE permet de ne pas afficher l’intervalle de confiance autour de la droite.

Super tutoriel ici sur library(ggplot2)


p1<-ggplot(mydata)+ aes(x = age, y =taille)
p2<-p1+ geom_point(col='red', size = 0.5)
p3<-p2+ geom_smooth(se = FALSE)
p4<-p2+ geom_smooth(method = "lm",se = FALSE)


# library(gridExtra) si on ne veut pas de graphes interactifs
#grid.arrange(p1,p2, p3, p4, ncol = 2)

# Comme subplot de la library(plotly) permet de rendre ces 4 plots intéractifs
subplot(p1,p2, p3, p4, nrows = 2)

Numérique \(X\) & Numérique \(Y\) & Qualitative \(F\)

Numérique \(X\) & Numérique \(Y\) & Qualitative \(F\):

Pour une reprensentation visuelle en Nuages de points \((X,Y)\) par modalités d’un facteur \(F\)

il suffit de préciser précisé color=F ici:

ggplot(mydata)+ aes(x = X, y =Y,color=F)+ geom_point()

Ainsi les points sont colorés en fonction des modalités du facteur donné, ici sexe


p1 <- ggplot(mydata) + aes(x = age, y = taille, color = sexe) + geom_point(size = 0.5)
p2 <- p1 + geom_smooth(aes(x = age, y = taille), se = FALSE)+guides(color = FALSE)
p4 <- p1 + geom_smooth(aes(x = age, y = taille), method = "lm",se = FALSE)


subplot(p2, p4, nrows = 1) %>%
  layout(title = "Taille en fonction de l'age et genre",
         xaxis = list(title = "Age"), 
         yaxis = list(title = "Taille"))

Task 6

Task 6.A.

Dessiner le nuage de points (age,scoreConnaissance).Afficher la droite des moindres carrées.

Solution

ggplot(mydata)+ aes(x = age, y =scoreConnaissance)+ geom_point(col='red', size = 0.5)+ geom_smooth(method = "lm",se = FALSE)

Task 6.B.

Dessiner les 3 nuages de points (age,scoreConnaissance) par modalités de la variable niveau. Afficher les 3 droites des moindres carrées.

Solution

ggplot(mydata)+ aes(x = age, y =scoreConnaissance,color=niveau)+ geom_point(col='red', size = 0.5)+ geom_smooth(method = "lm",se = FALSE)